import os
import pandas as pd
import numpy as np
from itertools import accumulate
from tqdm.notebook import tqdm


def get_各种指标(rr):
    def BARSLAST(series_1):
        return pd.Series(np.array(list(accumulate(~series_1, lambda x, y: (x + y) * y))), index=series_1.index)
    净值曲线 = 1 + rr.cumsum()
    时间跨度 = (rr.index[-1] - rr.index[0]).days / 365
    总收益 = rr.sum()
    年化收益 = 总收益 / 时间跨度
    年化波动 = rr.std() * (252 ** 0.5)
    夏普比率 = 年化收益 / 年化波动
    # 最大回撤 = (1 - 净值曲线 / 净值曲线.cummax()).max()
    # 当前回撤 = (1 - 净值曲线 / 净值曲线.cummax())[-1]
    最大回撤 = abs((rr.cumsum() - rr.cumsum().cummax()).min())
    当前回撤 = abs((rr.cumsum() - rr.cumsum().cummax())[-1])
    卡玛比率 = 年化收益 / 最大回撤
    最大下潜期 = BARSLAST(净值曲线 / 净值曲线.cummax() == 1).max()
    最大下潜期结束时间 = str(rr.index[BARSLAST(净值曲线 / 净值曲线.cummax() == 1).argmax()]).split()[0]
    当前下潜期 = BARSLAST(净值曲线 / 净值曲线.cummax() == 1)[-1]

    日度收益 = rr
    周度收益 = rr.resample('W').sum()
    月度收益 = rr.resample('M').sum()
    季度收益 = rr.resample('3M').sum()
    年度收益 = rr.resample('Y').sum()

    日度胜率 = (日度收益 > 0).mean()
    日度盈亏比 = abs(日度收益[日度收益 > 0].mean()/日度收益[日度收益 < 0].mean())
    单日最大亏损 = 日度收益.min()
    最大亏损日份 = str(日度收益.idxmin())[:10]
    单日最大盈利 = 日度收益.max()
    最大盈利日份 = str(日度收益.idxmax())[:10]
    最大连续亏损日份 = BARSLAST(日度收益 > 0).max()
    最大连续盈利日份 = BARSLAST(日度收益 < 0).max()

    周度胜率 = (周度收益 > 0).mean()
    周度盈亏比 = abs(周度收益[周度收益 > 0].mean() / 周度收益[周度收益 < 0].mean())
    单周最大亏损 = 周度收益.min()
    最大亏损周份 = str(周度收益.idxmin())[:10]
    单周最大盈利 = 周度收益.max()
    最大盈利周份 = str(周度收益.idxmax())[:10]
    最大连续亏损周份 = BARSLAST(周度收益 > 0).max()
    最大连续盈利周份 = BARSLAST(周度收益 < 0).max()

    月度胜率 = (月度收益 > 0).mean()
    月度盈亏比 = abs(月度收益[月度收益 > 0].mean() / 月度收益[月度收益 < 0].mean())
    单月最大亏损 = 月度收益.min()
    最大亏损月份 = str(月度收益.idxmin())[:7]
    单月最大盈利 = 月度收益.max()
    最大盈利月份 = str(月度收益.idxmax())[:7]
    最大连续亏损月份 = BARSLAST(月度收益 > 0).max()
    最大连续盈利月份 = BARSLAST(月度收益 < 0).max()

    季度胜率 = (季度收益 > 0).mean()
    季度盈亏比 = abs(季度收益[季度收益 > 0].mean() / 季度收益[季度收益 < 0].mean())
    单季最大亏损 = 季度收益.min()
    最大亏损季份 = str(季度收益.idxmin())[:7]
    单季最大盈利 = 季度收益.max()
    最大盈利季份 = str(季度收益.idxmax())[:7]
    最大连续亏损季份 = BARSLAST(季度收益 > 0).max()
    最大连续盈利季份 = BARSLAST(季度收益 < 0).max()

    年度胜率 = (年度收益 > 0).mean()
    年度盈亏比 = abs(年度收益[年度收益 > 0].mean() / 年度收益[年度收益 < 0].mean())
    单年最大亏损 = 年度收益.min()
    最大亏损年份 = str(年度收益.idxmin())[:4]
    单年最大盈利 = 年度收益.max()
    最大盈利年份 = str(年度收益.idxmax())[:4]
    最大连续亏损年份 = BARSLAST(年度收益 > 0).max()
    最大连续盈利年份 = BARSLAST(年度收益 < 0).max()

    xx1 = [
        '时间跨度', '年化收益', '年化波动', '夏普比率', '卡玛比率', '最大回撤', '当前回撤',
        '最大下潜期', '当前下潜期', '最大下潜期结束时间',
        '日度胜率', '周度胜率', '月度胜率', '季度胜率', '年度胜率',
        '日度盈亏比', '周度盈亏比', '月度盈亏比', '季度盈亏比', '年度盈亏比',
        '单日最大亏损', '单周最大亏损', '单月最大亏损', '单季最大亏损', '单年最大亏损',
        '单日最大盈利', '单周最大盈利', '单月最大盈利', '单季最大盈利', '单年最大盈利',
        '最大亏损日份', '最大亏损周份', '最大亏损月份', '最大亏损季份', '最大亏损年份',
        '最大盈利日份', '最大盈利周份', '最大盈利月份', '最大盈利季份', '最大盈利年份',
        '最大连续亏损日份', '最大连续亏损周份', '最大连续亏损月份', '最大连续亏损季份', '最大连续亏损年份',
        '最大连续盈利日份', '最大连续盈利周份', '最大连续盈利月份', '最大连续盈利季份', '最大连续盈利年份',
    ]
    xx2 = [
        时间跨度, 年化收益, 年化波动, 夏普比率, 卡玛比率, 最大回撤, 当前回撤,
        最大下潜期, 当前下潜期, 最大下潜期结束时间,
        日度胜率, 周度胜率, 月度胜率, 季度胜率, 年度胜率,
        日度盈亏比, 周度盈亏比, 月度盈亏比, 季度盈亏比, 年度盈亏比,
        单日最大亏损, 单周最大亏损, 单月最大亏损, 单季最大亏损, 单年最大亏损,
        单日最大盈利, 单周最大盈利, 单月最大盈利, 单季最大盈利, 单年最大盈利,
        最大亏损日份, 最大亏损周份, 最大亏损月份, 最大亏损季份, 最大亏损年份,
        最大盈利日份, 最大盈利周份, 最大盈利月份, 最大盈利季份, 最大盈利年份,
        最大连续亏损日份, 最大连续亏损周份, 最大连续亏损月份, 最大连续亏损季份, 最大连续亏损年份,
        最大连续盈利日份, 最大连续盈利周份, 最大连续盈利月份, 最大连续盈利季份, 最大连续盈利年份,
    ]
    return dict(zip(xx1, xx2))
